package com.juli.school.service.utils;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
import org.springframework.util.ResourceUtils;
import com.google.common.collect.Lists;
import net.coobird.thumbnailator.Thumbnails;

/**
 * @Description: 缩略图工具类
 * @author gaoxiang
 * @date 2017年10月24日 上午9:58:42
 */
public class ThumbnailUtils {
	
	private final static int width = 400;
	
	private final static int height = 300;
	
	public static void handler(String ffmpegPath, String upFilePath, String mediaPicPath) throws IOException {
		List<String> cutpic = Lists.newArrayList();
		// 视频提取工具的位置
		cutpic.add(ffmpegPath);
		// 添加参数＂-i＂，该参数指定要转换的文件
		cutpic.add("-i");
		// 视频文件路径
		cutpic.add(upFilePath);
		cutpic.add("-y");
		cutpic.add("-f");
		cutpic.add("image2");
		// 添加参数＂-ss＂，该参数指定截取的起始时间
		cutpic.add("-ss");
		// 添加起始时间为第1秒
		cutpic.add("1");
		// 添加参数＂-t＂，该参数指定持续时间
		cutpic.add("-t");
		// 添加持续时间为1毫秒
		cutpic.add("0.001");
		// 添加参数＂-s＂，该参数指定截取的图片大小
		cutpic.add("-s");
		// 添加截取的图片大小为800*600
		cutpic.add(width + "*" + height);
		// 添加截取的图片的保存路径
		cutpic.add(mediaPicPath);
		ProcessBuilder builder = new ProcessBuilder();
		builder.command(cutpic);
		builder.redirectErrorStream(true);
		// 如果此属性为 true，则任何由通过此对象的 start() 方法启动的后续子进程生成的错误输出都将与标准输出合并，
		// 因此两者均可使用 Process.getInputStream() 方法读取。这使得关联错误消息和相应的输出变得更容易
		builder.start();
	}
	
	/**
	 * @Description: 保存图片缩略图
	 * @author gaoxiang
	 * @date 2017年10月25日 上午9:40:10
	 */
	public static void saveThumbnail(String type, File targetFile, File digestFile) throws Exception {
		// 0是图片
		if ("0".equals(type)) {
			Thumbnails.of(new FileInputStream(targetFile)).size(width, height).toFile(digestFile);
			// 1是视频
		} else if ("1".equals(type)) {
			handler("ffmpeg", targetFile.getAbsolutePath(), digestFile.getAbsolutePath());
			// 添加水印
			mark(digestFile.getAbsolutePath(), "classpath:pic/2x.png", digestFile.getAbsolutePath(), 80, 70, 120, 120);
		}
	}
	
	/**
	 * @Description: 给图片增加图片水印
	 * @param inputImg 源图片，要添加水印的图片
	 * @param markImg 水印图片
	 * @param outputImg 输出图片(可以是源图片)
	 * @param width 水印图片宽度
	 * @param height 水印图片高度
	 * @param x 横坐标，相对于源图片
	 * @param y 纵坐标，同上
	 * @author gaoxiang
	 * @date 2017年10月25日 上午9:36:01
	 */
	public static void mark(String inputImg, String markImg, String outputImg, int width, int height, int x, int y) {
		// 读取原图片信息
		File inputImgFile = null;
		File markImgFile = null;
		Image img = null;
		Image mark = null;
		try {
			if (inputImg != null && markImg != null) {
				inputImgFile = ResourceUtils.getFile(inputImg);
				markImgFile = ResourceUtils.getFile(markImg);
			}
			while(true) {
				if(inputImgFile.exists()) {
					if (inputImgFile != null && inputImgFile.exists() && inputImgFile.isFile() && inputImgFile.canRead()) {
						img = ImageIO.read(inputImgFile);
					}
					break;
				}
			}
			if (markImgFile != null && markImgFile.exists() && markImgFile.isFile() && markImgFile.canRead()) {
				mark = ImageIO.read(markImgFile);
			}
			int imgWidth = img.getWidth(null);
			int imgHeight = img.getHeight(null);
			BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
			Graphics2D g = bufImg.createGraphics();
			g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);
			g.drawImage(mark, x, y, width, height, null);
			g.dispose();
			FileOutputStream outImgStream = new FileOutputStream(outputImg);
			ImageIO.write(bufImg, "jpg", outImgStream);
			outImgStream.flush();
			outImgStream.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws IOException {
		// handler("ffmpeg", "E:/meipai_20170703151609.mp4", "E:/axxx.jpg");
		mark("E:/catty.jpg", "E:/2x.png", "E:/catty1.jpg", 80, 60, 45, 100);
	}
}
